Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


Dockerfile v4.5.0-rc.1 (62ba0631) Text, 3.47 KB

T8b949e# Docker Build Stages:
T8b949e# 1. build-frontend: Build static frontend assets using Node
T8b949e# 2. builder: Install Python dependencies, build and collect backend files in a venv
T8b949e# 3. final image: Copy venv, install runtime deps, set up container user and config

T8b949e# ---- Global Build Args ----
Tff7b72ARG Te6edf3NODE_IMAGETff7b72=node:24-alpine
Tff7b72ARG Te6edf3NODE_HASHTff7b72=sha256:0340fa682d72068edf603c305bfbc10e23219fb0e40df58d9ea4d6f33a9798bf
Tff7b72ARG Te6edf3PYTHON_IMAGETff7b72=python:3.14.4-alpine3.23
Tff7b72ARG Te6edf3PYTHON_HASHTff7b72=sha256:27ac3ba1699f7a526ad19bf0d35c12369b43d3439e08297a880398d97899c3d8

T8b949e# ---- STAGE 1: Frontend Build ----
Tff7b72FROM Ta5d6ff${NODE_IMAGE}@${NODE_HASH} Tff7b72AS Ta5d6ffbuild-frontend
Tff7b72WORKDIR Ta5d6ff/src
Tff7b72RUN apk add --no-cache git
Tff7b72COPY package.json pnpm-lock.yaml vite.config.js tailwind.config.js postcss.config.js ./
Tff7b72COPY meshchatx/src/frontend ./meshchatx/src/frontend
Tff7b72RUN npm install -g pnpm@10.32.1 Tff7b72&& Tffea00\
pnpm install --frozen-lockfile Tff7b72&& Tffea00\
pnpm run build-frontend

T8b949e# ---- STAGE 2: Python Builder ----

Tff7b72FROM Ta5d6ff${PYTHON_IMAGE}@${PYTHON_HASH} Tff7b72AS Ta5d6ffbuilder
Tff7b72WORKDIR Ta5d6ff/build
Tff7b72RUN apk upgrade --no-cache Tff7b72&& Tffea00\
apk add --no-cache gcc musl-dev linux-headers python3-dev libffi-dev openssl-dev git

T8b949e# Install build tools in the system python
Tff7b72RUN pip install --no-cache-dir --upgrade Ta5d6ff"pip>=26.0" poetry setuptools wheel Ta5d6ff"jaraco.context>=6.1.0"

T8b949e# Create the clean venv for our application dependencies
Tff7b72RUN python -m venv /opt/venv
Tff7b72ENV Te6edf3PATHTff7b72=Ta5d6ff"Ta5d6ff/opt/venv/bin:Te6edf3$PATHTa5d6ff"

T8b949e# Install essential runtime tools in the venv
Tff7b72RUN pip install --no-cache-dir --upgrade Ta5d6ff"pip>=26.0" Ta5d6ff"setuptools" Ta5d6ff"jaraco.context>=6.1.0"

Tff7b72COPY pyproject.toml poetry.lock ./
T8b949e# poetry will use the active venv
Tff7b72RUN poetry config virtualenvs.create Tffa657false Tff7b72&& Tffea00\
poetry install --no-root --only main Tff7b72&& Tffea00\
rm -rf /root/.cache/pip /root/.cache/pypoetry

Tff7b72COPY meshchatx ./meshchatx
Tff7b72COPY --fromTff7b72=build-frontend /src/meshchatx/public ./meshchatx/public

Tff7b72RUN pip install --no-cache-dir . Tff7b72&& Tffea00\
python -c Ta5d6ff"import LXST.Filters; print('LXST Filters compiled successfully')" Tff7b72&& Tffea00\
# Remove unnecessary files from the venv
find /opt/venv -type d -name Ta5d6ff"tests" -exec rm -rf Tff7b72{Tff7b72} + Tff7b72&& Tffea00\
find /opt/venv -type d -name Ta5d6ff"test" -exec rm -rf Tff7b72{Tff7b72} + Tff7b72&& Tffea00\
find /opt/venv -type d -name Ta5d6ff"__pycache__" -exec rm -rf Tff7b72{Tff7b72} + Tff7b72&& Tffea00\
python -m compileall /opt/venv/lib/python3.14/site-packages

T8b949e# ---- STAGE 3: Final Image ----
Tff7b72FROM Ta5d6ff${PYTHON_IMAGE}@${PYTHON_HASH}

Tff7b72RUN apk upgrade --no-cache Tff7b72&& Tffea00\
apk add --no-cache ffmpeg opusfile libffi espeak-ng su-exec Tff7b72&& Tffea00\
python -m pip install --no-cache-dir --upgrade Ta5d6ff"pip>=26.0" Ta5d6ff"setuptools" Ta5d6ff"jaraco.context>=6.1.0" Tff7b72&& Tffea00\
rm -rf /root/.cache/pip Tff7b72&& Tffea00\
addgroup -g T79c0ff1000 meshchat Tff7b72&& adduser -u T79c0ff1000 -G meshchat -S meshchat Tff7b72&& Tffea00\
mkdir -p /config Tff7b72&& chown meshchat:meshchat /config

Tff7b72COPY --fromTff7b72=builder --chownTff7b72=meshchat:meshchat /opt/venv /opt/venv
Tff7b72COPY docker-entrypoint.sh /docker-entrypoint.sh
Tff7b72RUN chmod +x /docker-entrypoint.sh

Tff7b72ENV Te6edf3PATHTff7b72=Ta5d6ff"Ta5d6ff/opt/venv/bin:Te6edf3$PATHTa5d6ff"
Tff7b72ENV Te6edf3PYTHONUNBUFFEREDTff7b72=T79c0ff1
Tff7b72ENV Te6edf3PYTHONDONTWRITEBYTECODETff7b72=T79c0ff1

Tff7b72USER Ta5d6ffmeshchat

T8b949e# Note: Podman defaults to OCI image layout, which drops HEALTHCHECK; use: podman build --format docker
Tff7b72HEALTHCHECK --intervalTff7b72=30s --timeoutTff7b72=5s --start-periodTff7b72=90s --retriesTff7b72=T79c0ff3 Tffea00\
CMD Tff7b72[Ta5d6ff"python", Ta5d6ff"-c", Ta5d6ff"import ssl, urllib.request; urllib.request.urlopen('https://127.0.0.1:8000/api/v1/status', context=ssl._create_unverified_context())"Tff7b72]

Tff7b72ENTRYPOINT Tb4b4b4[Ta5d6ff"/docker-entrypoint.sh"Tb4b4b4]
Tff7b72CMD Tb4b4b4[Ta5d6ff"meshchatx"Tb4b4b4, Ta5d6ff"--host=0.0.0.0"Tb4b4b4, Ta5d6ff"--reticulum-config-dir=/config/.reticulum"Tb4b4b4, Ta5d6ff"--storage-dir=/config/.meshchat"Tb4b4b4, Ta5d6ff"--headless"Tb4b4b4]


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────